#include "HManhattan.h"
#include "Casillero.h"
#include "CasilleroIDA.h"
#include <stdlib.h>
#include "Excepcion.h"

int HManhattan::h(CNodo* estado) {
    const Casillero* casillero = estado->Casillas();
    short boardSize = casillero->Dimenciones();
    char valor;
    int mDistance = 0;
    int actualX, actualY;
    for (int i = 0; i < boardSize * boardSize; i++) {
        valor = casillero->Info(i);
        if (valor == 0) {
            continue;
        }
        actualX = i / boardSize;
        actualY = i % boardSize;
        mDistance += tileValue(valor, actualX, actualY, boardSize);
    }
    return mDistance;
}

int HManhattan::tileValue(char tileNumber, int actualX, int actualY, short boardSize) {
    char finalX = tileNumber / (char) boardSize;
    char finalY = tileNumber % (char) boardSize;
    return (abs(finalX - actualX) + abs(finalY - actualY));
}
